package com.hcss.common.util.excel.cell;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.FormulaError;
import org.apache.poi.ss.usermodel.Row;

import com.hcss.common.util.StringUtil;

/**
 * @Description:Excel表格中单元格工具类
 * @Author:momo
 * @Since:2018年12月21日
 * @Version:1.1.0
 */
public class CellUtil {
	
	/**
	 * 获取Cell的值
	 * @param cell 单元格
	 * @return
	 */
	public static Object getCellValue(Cell cell) {
		if(null == cell)
			return null;
		return getCellValue(cell, cell.getCellTypeEnum());
	}
	
	/**
	 * 获取单元格值<br>
	 * 如果单元格值为数字格式，则判断其格式中是否有小数部分，无则返回Long类型，否则返回Double类型
	 * @param cell 单元格
	 * @param cellType 单元格值类型{@link CellType}枚举，如果为null默认使用cell的类型
	 * @return 值，类型可能为：Double、Boolean、String
	 */
	public static Object getCellValue(Cell cell, CellType cellType) {
		if (null == cell) {
			return null;
		}
		if (null == cellType) {
			cellType = cell.getCellTypeEnum();
		}

		Object value;
		switch (cellType) {
		case NUMERIC:
			value = getNumericValue(cell);
			break;
		case BOOLEAN:
			value = cell.getBooleanCellValue();
			break;
		case BLANK:
			value = StringUtil.EMPTY;
			break;
		case ERROR:
			final FormulaError error = FormulaError.forInt(cell.getErrorCellValue());
			value = (null == error) ? StringUtil.EMPTY : error.getString();
			break;
		default:
			value = cell.getStringCellValue().trim();
		}

		return value;
	}

	/**
	 * 获取已有行或创建新行
	 * @param row Excel表的行
	 * @param cellIndex 列号
	 * @return {@link Row}
	 */
	public static Cell getOrCreateCell(Row row, int cellIndex) {
		Cell cell = row.getCell(cellIndex);
		if (null == cell) {
			cell = row.createCell(cellIndex);
		}
		return cell;
	}
	
	/**
	 * 获取数字类型的单元格值
	 * @param cell 单元格
	 * @return 单元格值，可能为Long、Double
	 */
	private static Object getNumericValue(Cell cell) {
		final double value = cell.getNumericCellValue();

		final CellStyle style = cell.getCellStyle();
		if (null == style) {
			return value;
		}

		final String format = style.getDataFormatString();
		// 普通数字
		if (null != format && format.indexOf(StringUtil.DOT) < 0) {
			final long longPart = (long) value;
			// 对于无小数部分的数字类型，转为Long
		}
		return value;
	}

}
